home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Entertainment / tblt / tblt⁄draw.c < prev    next >
Text File  |  1986-09-07  |  5KB  |  166 lines

  1. /*
  2.  * draw.c - miscellaneous drawing routines for Tablut.
  3.  *
  4.  */
  5.  
  6. #include <quickdraw.h>
  7. #include <window.h>
  8. #include <resource.h>
  9. #include <toolutil.h>
  10. #include <packages.h>
  11. #include <control.h>
  12. #include <memory.h>
  13. #include "tablut.h"
  14.  
  15. #define LIGHTPAT    129    /* Resource ID of the highlight pattern    */
  16.  
  17. #define STATSTRS    129    /* Resource ID of the game status strings */
  18. #define SS_MOVE        1    /* index for the "Move:" string        */
  19. #define SS_WHITE    2    /* index for the "White's Game" string    */
  20. #define SS_BLACK    3    /* index for the "Black's Game" string    */
  21.  
  22. Rect upboardrect, lwboardrect;    /* destination rects for the board */
  23. PicHandle upboard, lwboard;    /* upper and lower board parts     */
  24.  
  25. char movestr[65];        /* Pascal "Move:" string    */
  26. char whitestr[65];        /* Pascal "White's Game" string    */
  27. char blackstr[65];        /* Pascal "Black's Game" string    */
  28.  
  29. /*
  30.  * getboard() - get the pieces of the board picture together
  31.  *  in the appropriate part of the window
  32.  */
  33. getboard()
  34. {
  35.     Point offboard;    /* offset from board coords to window coords */
  36.     /*
  37.      * get handles for the pictures of the board,
  38.      * then create the zero-aligned rectangles for the parts.
  39.      * The lower board goes directly below the upper board.
  40.      */
  41.  
  42.     upboard = (PicHandle) GetNamedResource((long) 'PICT', "\Pupper_board");
  43.     lwboard = (PicHandle) GetNamedResource((long) 'PICT', "\Plower_board");
  44.     HLock((Handle) upboard);
  45.     HLock((Handle) lwboard);
  46.     movmem((char *) &((*upboard)->picFrame), (char *) &upboardrect,
  47.       sizeof(Rect));
  48.     movmem((char *) &((*lwboard)->picFrame), (char *) &lwboardrect,
  49.       sizeof(Rect));
  50.     OffsetRect(&upboardrect,
  51.       -((*upboard)->picFrame.left), -((*upboard)->picFrame.top));
  52.     OffsetRect(&lwboardrect, -((*lwboard)->picFrame.left),
  53.       -((*lwboard)->picFrame.top) + upboardrect.bottom);
  54.     HUnlock((Handle) upboard);
  55.     HUnlock((Handle) lwboard);
  56.  
  57.     offboard.h = (mywindow->portRect.left + mywindow->portRect.right) / 2 -
  58.       (upboardrect.left + upboardrect.right) / 2;
  59.     offboard.v = (mywindow->portRect.top + mywindow->portRect.bottom) / 2 -
  60.       (upboardrect.top + lwboardrect.bottom) / 2;
  61.     OffsetRect(&upboardrect, offboard.h, offboard.v);
  62.     OffsetRect(&lwboardrect, offboard.h, offboard.v);
  63.  
  64.     SetRect(&boardrect, upboardrect.left, upboardrect.top,
  65.       lwboardrect.right, lwboardrect.bottom);
  66.     boardcenter.h = (boardrect.left + boardrect.right) / 2;
  67.     boardcenter.v = (boardrect.top + boardrect.bottom) / 2;
  68. }
  69.  
  70. /*
  71.  * getstate() - load the game status report resources
  72.  */
  73. getstate()
  74. {
  75.     GetIndString(movestr, STATSTRS, SS_MOVE);
  76.     GetIndString(whitestr, STATSTRS, SS_WHITE);
  77.     GetIndString(blackstr, STATSTRS, SS_BLACK);
  78. }
  79.  
  80. /*
  81.  * drawwindow() - draw the tablut window,
  82.  *  drawing the board and pieces in the appropriate places.
  83.  *  This routine is called to satisfy update events, so it has to save &
  84.  *  restore the GraphPort (in case we update when this isn't
  85.  *  the front window).
  86.  */
  87. drawwindow()
  88. {
  89.     GrafPtr saveport;
  90.     struct pieceimage *p;    /* the piece being examined    */
  91.  
  92.     BeginUpdate(mywindow);
  93.     GetPort(&saveport);
  94.     SetPort(mywindow);
  95.     DrawPicture(upboard, &upboardrect);
  96.     DrawPicture(lwboard, &lwboardrect);
  97.     for (p = &piece[0]; p < &piece[NUMPIECES]; ++p) {
  98.     if (onscreen(p)) {
  99.         splatpiece((int) (p - &piece[0]));
  100.     }
  101.     }
  102.     DrawControls(mywindow);
  103.     drawstate();
  104.     SetPort(saveport);
  105.     EndUpdate(mywindow);
  106. }
  107.  
  108. /*
  109.  * drawstate() - draw the move number and winner (if any)
  110.  */
  111. drawstate()
  112. {
  113.     char numstr[20];    /* (C) Ascii move number    */
  114.     short len;        /* # of chars in numstr[]    */
  115.     short wid, wid2;    /* screen width of a string    */
  116.     FontInfo f;        /* info about the screen font    */
  117.     Rect r;        /* a rectangle to erase        */
  118.  
  119.     MoveTo(16, 100); DrawString(movestr);
  120.     NumToString((long) (curmove - 1), numstr);
  121.     ptoc(numstr);
  122.     len = strlen(numstr);
  123.     wid = TextWidth(numstr, 0, len);
  124.     /*
  125.      * "why not just use srcCopy for the text?" I hear the reader saying.
  126.      * "Because", I reply, "srcCopy for text erases far too many pixels."
  127.      * See the description of TextMode() in Inside Macintosh.
  128.      */
  129.     GetFontInfo(&f);
  130.     SetRect(&r, 56, 100 - f.ascent, 96, 100 + f.descent);
  131.     EraseRect(&r);
  132.     MoveTo(96 - wid, 100); DrawText(numstr, 0, len);
  133.  
  134.     wid = StringWidth(whitestr);
  135.     wid2 = StringWidth(blackstr);
  136.     if (wid < wid2) wid = wid2;
  137.     SetRect(&r, 16, 120 - f.ascent, 16 + wid, 120 + f.descent);
  138.     EraseRect(&r);
  139.     MoveTo(16, 120);
  140.     if (winner == WHITEWIN) {
  141.     DrawString(whitestr);
  142.     } else if (winner == BLACKWIN) {
  143.     DrawString(blackstr);
  144.     }
  145. }
  146.  
  147. /*
  148.  * lightrect() - highlight (or unhighlight) the given rectangle
  149.  *  by Xor'ing in a light pattern.
  150.  */
  151. lightrect(rp)
  152. Rect *rp;
  153. {
  154.     PenState savepen;
  155.     PatHandle blinkpat;
  156.  
  157.     GetPenState(&savepen);
  158.     PenMode(patXor);
  159.     blinkpat = GetPattern(LIGHTPAT);
  160.     HLock((Handle) blinkpat);
  161.     PenPat(*blinkpat);
  162.     PaintRect(rp);
  163.     HUnlock((Handle) blinkpat);
  164.     SetPenState(&savepen);
  165. }
  166.